package com.mastercard.assets.web.struts.actions;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.mastercard.assets.jpa.TblAsset;
import com.mastercard.assets.jpa.TblCampania;
import com.mastercard.assets.jpa.TblCampaniaMes;
import com.mastercard.assets.jpa.TblCampaniaProductoAdq;
import com.mastercard.assets.jpa.TblCampaniaProductoUsuario;
import com.mastercard.assets.jpa.TblPaquete;
import com.mastercard.assets.jpa.TblPreimplementacion;
import com.mastercard.assets.jpa.TblProducto;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.CampanasPorAutorizarForm;
import com.mastercard.assets.web.util.to.UserLogin;
import java.math.BigDecimal;
import java.math.RoundingMode;

public class CampanasPorAutorizarBuscarCampana
	extends
		Action
{
	public ActionForward execute(
							ActionMapping mapping , 
							ActionForm form ,
							HttpServletRequest request , 
							HttpServletResponse response )
		throws 
			IOException , 
			ServletException
	{
		HttpSession session = request.getSession( ) ;
		
		// en caos de null
		if( session == null )
			return mapping.findForward( "noLogin" ) ;
		
		// toma el userLogin
		UserLogin user = ( UserLogin ) session.getAttribute( "UserLogin" ) ;
		
		// en caso de null
		if( user == null )
			return mapping.findForward( "noLogin" ) ;
		
		// verifica que el rol en el que esta es banco (2)
		int role = user.getActualRoleId( ) ;
		
//		if( role > 2 )
//			return mapping.findForward( "RoleNoValido" ) ;
		
		// toma la cveCampania
		int cveCampania = 0 ;
		String cveCampaniaS = request.getParameter( "cveCampania" ) ;
		
		try
		{
			cveCampania = Integer.parseInt( cveCampaniaS ) ;
			
			// en caso de que cveCampania es menor a 1
			if( cveCampania < 1 )
			{
				return mapping.findForward( "NoEligioCampana" ) ;
			}
		}catch( Exception e )
		{
			
		}
		
		TblCampania campania = MasterCardDAO.findCampaignById( cveCampania ) ;
                float costoCampania = 0,
                        inversionBanco = Float.parseFloat( campania.getInversion( ).trim( ) ) ;
		
		// en caso de null
		if( campania == null )
		{
                    MasterCardDAO.closeEntityManager( ) ;
			return mapping.findForward( "NoExisteCampana" ) ;
		}
		
		// en caso de que si exista
		// lo coloca en el Form
		// crea el form
		CampanasPorAutorizarForm f = new CampanasPorAutorizarForm( ) ;
		
		f.setCampania( campania ) ;
                
                
                // toma todos los registros correspondientes de tblCampaniaProductoAdq
                List< TblCampaniaProductoAdq > tblCampaniaProductoAdq = MasterCardDAO.getAllActiveCampaignProdAdqByCampaingId( campania.getCveCampania( ) ) ; 
                
                // toma todos los registros correspondientes de tblCampaniaProductoUsuario
                List< TblCampaniaProductoUsuario > tblCampaniaProductoUsuario = MasterCardDAO.getAllActiveCampaignProdUsrByCampaingId( campania.getCveCampania( ) ) ; 
                
                List<TblCampaniaMes> TblCampaniaMes = new ArrayList< TblCampaniaMes >( ) ;
                
                //List< TblCampaniaMes > tcm = new ArrayList< TblCampaniaMes >( ) ;
                if ( tblCampaniaProductoUsuario != null )
                {
                        for ( TblCampaniaProductoUsuario tcpu : tblCampaniaProductoUsuario )
                    {
                        for ( TblCampaniaMes tcm : tcpu.getTblCampaniaMeses( ) )
                        {
                            TblCampaniaMes.add( tcm ) ;
                        }
                    }
                }
                
                ArrayList assetNmae = new ArrayList( ) ,
                          tipoPaq = new ArrayList( ) ,
                          numPaq = new ArrayList( ), 
                        costoPaq = new ArrayList( ) ;
                
                List< TblPreimplementacion > campPreImpl = campania.getTblPreimplementacions( ) ;
                int i = 0 ;
                for( TblPreimplementacion cp : campPreImpl ){// recorre preimplementacion ini
                    
                    List< TblAsset > assetList = cp.getTblAssets( ) ;
                    
                    assetNmae.add(i, assetList.get( 0 ).getNombre( ) ) ;
                    
                    TblAsset asset = assetList.get( 0 ) ;
                    
                    List< TblPaquete > packCamp = campania.getTblPaquetes( ) ;
                    int sencillos = 0, dobles = 0, contador = 0 ;
                    float costoDobles = 0 , costoSencillo = 0 ;
                    
                    for( TblPaquete p : packCamp ){//recorre paquetes ini
                        
                        if( p.getTblAsset( ).getCveAsset( ) == asset.getCveAsset( ) ){
                            
                            if( p.getHabitacion( ) == 1 ){
                                sencillos ++ ;
                                if( p.getFondeado( ) == 1 ){
                                    costoSencillo += asset.getCostoSenLoc( ) ;
                                    costoCampania += costoSencillo ;
                                }else
                                    if( p.getFondeado( ) == 2 ){
                                        costoSencillo += asset.getCostoSenReg( ) ;
                                        costoCampania += costoSencillo ;
                                    }
                            }else
                                if( p.getHabitacion( ) == 2 ){
                                    dobles ++ ;
                                    if( p.getFondeado( ) == 1 ){
                                        costoDobles += asset.getCostoDobLoc( ) ;
                                        costoCampania += costoDobles ;
                                    }else
                                        if( p.getFondeado( ) == 2 ){
                                            costoDobles += asset.getCostoDobReg( ) ;
                                            costoCampania += costoDobles ;
                                        }
                                }
                            
                        }                        
                        
                    }//recorre paquetes fin
                    boolean aumenta = false ;
                    
                    if( sencillos > 0 ){
                        tipoPaq.add(i, "Sencillo") ;
                          numPaq.add(i, sencillos ) ;
                        costoPaq.add(i, costoSencillo) ;
                        aumenta = true ;
                    }
                    
                    if( dobles > 0 ){
                        
                        if( aumenta ){
                            i++ ;
                            assetNmae.add(i, assetList.get( 0 ).getNombre( ) ) ;
                        }                        
                        
                        tipoPaq.add(i, "Dobles") ;
                          numPaq.add(i, dobles ) ;
                        costoPaq.add(i, costoDobles) ;
                        
                    }
                    
                    i++ ;
                    
                }// recorre preimplementacion Fin
                float pLaverage = inversionBanco/costoCampania ;
                BigDecimal nRoi = new BigDecimal( 0 ) , precioCampana = new BigDecimal( Float.toString( costoCampania ) ) ;
                nRoi = campania.getRevenue().divide( precioCampana, 4, RoundingMode.UP) ;
                request.setAttribute("nRoi", nRoi);
                request.setAttribute("laverage", pLaverage);
                request.setAttribute("assetname", assetNmae);
                request.setAttribute("numPak", numPaq);
                request.setAttribute("tipoPak", tipoPaq);
                request.setAttribute("costoPak", costoPaq);
                
                int tamanio = campania.getMeses( ) ;
                int[] meses = new int[tamanio] ;
                int[] ttp = new int[campania.getTblProductos( ).size( )] ;
                int totalp = 0 ;
                int tMes = 0 ;
                int vtar = 0 ;
                
                for (int x = 0 ; x < tamanio  ; x++  )
                {
                    meses[ x ] = x + 1 ;
                }
                
                for ( TblProducto tp : campania.getTblProductos() )
                    {
                        
                        for (TblCampaniaProductoAdq tca :  tblCampaniaProductoAdq )
                        {
                            vtar = tca.getTarjetas( ) ;
                            totalp += vtar ;
                            if ( tca.getTblProducto( ).getCveProducto( ) == tp.getCveProducto( ) )
                            {
                                ttp[ tMes ] += tca.getTarjetas( ) ; 
                            }
                        }
                        tMes += 1 ;
                    }                    
                
                
//                int total = totalp / 2 ;
//                int total = totalp ;
                int total = 0 ;
                
                for( int r = 0 ; r < ttp.length ; r++ ){
                        total += ttp[ r ] ;
                    }
                
                
		
                f.setMeses( meses ) ;
                
                f.setTblCampaniaProductoAdq( tblCampaniaProductoAdq );
                
                f.setTtp( ttp ) ;
                
                f.setTotal( total ) ;
                
                f.setTblCampaniaProductoUsr( tblCampaniaProductoUsuario ) ;
                
                f.setTblCampaniaMeses( TblCampaniaMes ) ;
                
                
		// guarda en el request
		request.setAttribute( "CampanasPorAutorizarForm" , f ) ;
                request.setAttribute( "SuRol" , user.getActualRoleId( ) ) ;
		
		// genera el form
		/////////////////
		
                MasterCardDAO.closeEntityManager( ) ;
		return mapping.findForward( "success" ) ;
	}
	
}
